import time
import random
from queue import Queue
from threading import Thread


class Producer(Thread):  # 生产者类
    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        i = 0
        while True:
            a = random.randint(0, 10)
            b = random.randint(90, 100)
            i += 1
            print(f'生产者第{i}次生产了两个数字：{a}, {b}')
            self.queue.put((a, b))
            time.sleep(2)


class Consumer(Thread):  # 消费者类
    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        i = 0
        while True:
            num_tuple = self.queue.get(block=True)  # 如果队列为空，调用线程会阻塞，直到队列中有元素被放入。
            sum_a_b = sum(num_tuple)
            i += 1
            print(f'消费者第{i}次消费了一组数，{num_tuple[0]} + {num_tuple[1]} = {sum_a_b}')
            time.sleep(random.randint(0, 10))


queue = Queue()  # 创建了一个队列实例。这个队列用于在生产者和消费者之间传递数据。
producer = Producer(queue)  # 创建了一个生产者实例，并将队列作为参数传递给它。生产者将使用这个队列来存放生成的数据。
consumer = Consumer(queue)  # 创建了一个消费者实例，并将同一个队列作为参数传递给它。消费者将从这个队列中取出数据进行处理

producer.start()  # 启动了生产者线程。生产者开始运行，并生成数据放入队列中。
consumer.start()  # 启动了消费者线程。消费者开始运行，并从队列中取出数据进行处理。
producer.join()  # 等待生产者线程结束。join 方法是用来等待线程终止的，确保生产者完成其工作。
consumer.join()  # 等待消费者线程结束。确保消费者处理完所有从队列中取出的数据。

